﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MailServer.Client {
    public class Client {
        private string path;
        private Data data;

        public Client(Server.Server server, string user, string path) {
            this.path = path;
            data = (Data)Persistence.Persistence.Deserealize(path);
            if(data == null)
                data = new Data(user, server);
        }

        /// <summary>
        /// Metodo que consulta al servidor al fin de ver si el usuario tiene algun mensaje
        /// </summary>
        /// <returns>retorna la cantidad de mensajes que tiene el usuario</returns>
        public int CheckMessages() {
            return data.GetMessageWaitingServer();
        }

        /// <summary>
        /// Metodo que obtiene la informacion necesaria del usuario, crea un objteo de tipo message y lo envia al servidor
        /// </summary>
        /// <param name="to">Usuario destinatario</param>
        /// <param name="subject"></param>
        /// <param name="body"></param>
        public void SendMessage(string to, string subject, string body) {
            data.Post(to, subject, body);
            Persist();
        }

        public List<Message.Message> ListMessages() {
            return data.ListMessages();
        }

        public List<Message.Message> ListMessagesFrom(string from) {
            return data.ListMessagesFrom(from);
        }

        public void SetReaded(Message.Message message) {
            data.SetReaded(message);
            Persist();
        }

        public bool IsReaded(Message.Message message) {
            return data.IsReaded(message);
        }

        public int GetMessageWaitingServer() {
            return data.GetMessageWaitingServer();
        }

        public void SyncMessages() {
            data.SyncMessages();
            Persist();
        }

        public void RemoveMessage(Message.Message message) {
            data.RemoveMessage(message);
            Persist();
        }

        public void Post(string to, string subject, string body) {
            data.Post(to, subject, body);
            Persist();
        }

        private void Persist() {
            Persistence.Persistence.Serialize(data, path);
        }
    }
}
